package com.rabbitmq.exchange.topic;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.utils.RabbitMQUtils;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 留个纪念 ~~
 */
public class LIUNIAN {
    public static void main(String[] args) {
        //创建工厂对象用于指定链接的信息
        //创建链接以及通道,并添加异常处理同时在try..catch执行完成后自动释放资源
        try(Connection connection= RabbitMQUtils.getConnection();
            Channel channel=connection.createChannel()){
            String  exchangeName="topicExchange222";
            channel.exchangeDeclare(exchangeName,"fanout",true);
            String queueName1="qq3";
            channel.queueDeclare(queueName1,true,false,false,null);
            String routingKey="ddaaaaaa";
            channel.queueBind(queueName1, exchangeName,"dd.bb.#");

            String queueName2="qq4";
            channel.queueDeclare(queueName2,true,false,false,null);
            channel.queueBind(queueName2, exchangeName,"aa.bb.#");
            String message=String.format("Fanout测试消息  RoutingKey:  %s ",routingKey);
//            channel.basicPublish(exchangeName,routingKey,null,message.getBytes());
            channel.basicPublish(exchangeName,routingKey,null,message.getBytes());
            System.out.println("消息发送成功");
        } catch (TimeoutException | IOException e) {
            e.printStackTrace();
        }
    }

    //问题1 topic可以当做direct用吗   可
    //问题2 direct可以当做topic用吗   不可以 direct不支持把表达式左右bindingkey绑定队列 这应该是topic的特性
    //问题3 direct可以当做fanout用吗  勉强算可以 direct交换机就算绑定了2个队列，那只会相当于是这2个队列的fanout
    //问题4 direct可以不指定队列发送吗 像完全的fanout那样子 不可以 direct交换机不绑定队列消息直接被丢弃了 没有入队的机会
    //问题5 fanout可以当topic用吗  不可以 fanout虽然可以通过bindingkey绑定队列，但是根据其特性会无视bindingkey直接发送到所有绑定的队列，如果这些队列是持久的，会留住消息，不过正常的用法都是临时队列，正常情况就发的时候没收到就没了
    //问题6 fanout可以当direct用吗 不可以 因为根本就没有根据bindingkey去路由的能力 写了routingkey也没用


    //总结
    // 使用direct的话，bindingkey是精确的 写表达式也没用 发消息必须指定routingkey,不然消息直接丢弃
    // 使用fanout的话，特性是可以不绑定routingkey,消息会进入所有连接的队列
    // 使用topic的话，特性是可以支持bindingkey表达式，消息会routingkye满足的条件进行路由入队
}
